import 'package:flex_color_scheme/flex_color_scheme.dart';
import 'package:flutter/material.dart';
import '../configs/app_store.dart';

// The width size of the scrolling button.
const double _kWidthOfScrollItem = 71.6;

// Horizontal theme selector of themes offered in our [AppColor.schemes].
//
// This example uses a StatefulWidget for the scroll controller and
// index to keep track of previously selected color scheme, so we can animate
// to the new selection, also done when the themeController schemeIndex is
// changed via other UI controls, like in the drop box that is also used in
// this demo as another way to change the color scheme.
//
// The theme is controlled via the passed in ThemeController.
class ThemeSelector extends StatefulWidget {
  const ThemeSelector({
    super.key,
  });

  @override
  State<ThemeSelector> createState() => _ThemeSelectorState();
}

class _ThemeSelectorState extends State<ThemeSelector> {
  late ScrollController scrollController;
  late int schemeIndex;

  @override
  void initState() {
    super.initState();
    schemeIndex = appStore.colorSchemeIndex;
    scrollController = ScrollController(
      initialScrollOffset: _kWidthOfScrollItem * schemeIndex,
    );
  }

  @override
  void dispose() {
    scrollController.dispose();
    super.dispose();
  }

  @override
  void didChangeDependencies() {
    // Index got updated in popup and deps changed, animate it to new index.
    if (appStore.colorSchemeIndex != schemeIndex) {
      schemeIndex = appStore.colorSchemeIndex;
      scrollController.animateTo(_kWidthOfScrollItem * schemeIndex,
          duration: const Duration(milliseconds: 350),
          curve: Curves.easeOutCubic);
    }
    super.didChangeDependencies();
  }

  @override
  Widget build(BuildContext context) {
    final bool isLight = Theme.of(context).brightness == Brightness.light;
    return SizedBox(
      height: 76,
      child: Row(
        children: <Widget>[
          Expanded(
            child: ListView.builder(
              controller: scrollController,
              physics: const ClampingScrollPhysics(),
              scrollDirection: Axis.horizontal,
              itemCount: FlexColor.schemesList.length,
              itemBuilder: (BuildContext context, int index) {
                return FlexThemeModeOptionButton(
                  optionButtonBorderRadius: 12,
                  height: 32,
                  width: 32,
                  padding: const EdgeInsets.all(0.4),
                  optionButtonMargin: EdgeInsets.zero,
                  borderRadius: 0,
                  unselectedBorder: BorderSide.none,
                  selectedBorder: BorderSide(
                    color: Theme.of(context).primaryColorLight,
                    width: 5,
                  ),
                  onSelect: () {
                    scrollController.animateTo(
                      _kWidthOfScrollItem * index,
                      duration: const Duration(milliseconds: 350),
                      curve: Curves.easeOutCubic,
                    );
                    schemeIndex = index;
                    appStore.setColorSchemeIndex(index);
                  },
                  selected: appStore.colorSchemeIndex == index,
                  backgroundColor: Theme.of(context).colorScheme.surface,
                  flexSchemeColor: isLight
                      ? FlexColor.schemesList[index].light
                      : FlexColor.schemesList[index].dark,
                );
              },
            ),
          ),
        ],
      ),
    );
  }
}
